import { http } from '@/utils/request'
import type {
	AttachmentInfo,
	FileUploadParams,
	FileUploadResponse,
	FileListParams,
	CommonResponse,
	FileUploadBatchResponse
} from './types'

/**
 * 文件管理 API 基础路径
 */

const prefix = '/file/attachment'

/**
 * 文件管理 API 类
 * 提供统一的文件上传、下载、管理接口
 */
export class FileAPI {
	/**
	 * 获取附件详情
	 * @param id 附件ID
	 * @returns 附件信息
	 */
	static async getById(id: number): Promise<ResponseData<AttachmentInfo>> {
		return http.get<AttachmentInfo>(`${prefix}/${id}`, {})
	}

	/**
	 * 上传文件
	 * @param file 文件对象
	 * @param params 上传参数
	 * @returns 上传响应
	 */
	static async upload(file: File, params: FileUploadParams): Promise<ResponseData<number>> {
		const formData = new FormData()
		formData.append('file', file)

		return http.post<number>(`${prefix}/upload`, formData, {
			headers: {
				'Content-Type': 'multipart/form-data'
			},
			params
		})
	}

	// 批量上传
	static async uploadBatch(files: File[], params: FileUploadParams): Promise<ResponseData<number[]>> {
		const formData = new FormData()
		files.forEach(file => {
			formData.append('files', file)
		})
		return http.post<number[]>(`${prefix}/upload/batch`, formData, {
			headers: {
				'Content-Type': 'multipart/form-data'
			},
			params
		})
	}

	/**
	 * 删除文件
	 * @param id 文件ID
	 * @returns 操作结果
	 */
	static async deleteById(id: number): Promise<ResponseData<any>> {
		return http.delete<any>(`${prefix}/${id}`, {})
	}

	/**
	 * 批量删除文件
	 * @param ids 文件ID数组
	 * @returns 操作结果
	 */
	static async deleteBatch(ids: number[]): Promise<ResponseData<any>> {
		return http.delete<any>(`${prefix}/batch`, ids)
	}

	/**
	 * 查询文件列表
	 * @param params 查询参数
	 * @returns 文件列表
	 */
	static async getList(params?: FileListParams): Promise<
		ResponseData<{
			list: AttachmentInfo[]
			total: number
		}>
	> {
		return http.get<{
			list: AttachmentInfo[]
			total: number
		}>(`${prefix}/list`, params)
	}

	/**
	 * 下载文件
	 * @param id 文件ID
	 * @returns 文件流
	 */
	static async download(id: number): Promise<Blob> {
		return http.request<Blob>({
			url: `${prefix}/download/${id}`,
			method: 'get',
			responseType: 'blob'
		})
	}

	/**
	 * 根据文件路径下载文件
	 * @param filePath 文件路径
	 * @returns 文件流
	 */
	static async downloadByPath(filePath: string): Promise<Blob> {
		return http.request<Blob>({
			url: `${prefix}/download`,
			method: 'get',
			params: { filePath },
			responseType: 'blob'
		})
	}

	/**
	 * 预览文件（获取文件访问URL）
	 * @param id 文件ID
	 * @returns 预览URL
	 */
	static async getPreviewUrl(id: number): Promise<ResponseData<{ url: string }>> {
		return http.get<{ url: string }>(`${prefix}/preview/${id}`, {})
	}
}

/**
 * 便捷的函数式API导出
 */

/**
 * 获取附件详情
 */
export const getAttachmentById = FileAPI.getById

/**
 * 上传文件
 */
export const uploadFileApi = FileAPI.upload

/**
 * 批量上传文件
 */
export const uploadBatchFileApi = FileAPI.uploadBatch

/**
 * 删除文件
 */
export const deleteFileApi = FileAPI.deleteById

/**
 * 批量删除文件
 */
export const deleteBatchFilesApi = FileAPI.deleteBatch

/**
 * 获取文件列表
 */
export const getFileListApi = FileAPI.getList

/**
 * 下载文件
 */
export const downloadFileApi = FileAPI.download

/**
 * 根据路径下载文件
 */
export const downloadFileByPathApi = FileAPI.downloadByPath

/**
 * 获取文件预览URL
 */
export const getFilePreviewUrlApi = FileAPI.getPreviewUrl

// 默认导出API类
export default FileAPI
